package com.zby.admin.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zby.admin.pojo.Products;
import com.zby.admin.pojo.User;
import com.zby.admin.pojo.vo.ProductPlatformVo;
import com.zby.admin.service.ProductService;
import com.zby.admin.service.ImagesService;
import com.zby.admin.mapper.UserMapper;
import com.zby.enums.AuditEnum;
import com.zby.utils.PageResult;
import com.zby.utils.Result;
import jakarta.annotation.Resource;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/platform")
@CrossOrigin // 支持跨域请求
public class PlatformController {
    
    @Resource
    private ProductService productService;
    
    @Resource
    private ImagesService imagesService;
    
    @Resource
    private UserMapper userMapper;
    
    /**
     * 获取平台商品列表（分页）
     * @param page 页码
     * @param pageSize 每页数量
     * @return 分页商品列表
     */
    @GetMapping("/list")
    public Result<PageResult<ProductPlatformVo>> getProductList(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer pageSize) {
        
        // 构造查询条件
        QueryWrapper<Products> queryWrapper = new QueryWrapper<>();
        // 只查询已审核通过的商品
        queryWrapper.eq("status", AuditEnum.APPROVED); 
        // 只查询未删除的数据
        queryWrapper.eq("deleted", 0); 
        // 按创建时间倒序排列
        queryWrapper.orderByDesc("create_time");
        // 只查询有库存的商品
        queryWrapper.gt("number", 0);
        
        // 计算偏移量
        int offset = (page - 1) * pageSize;
        
        // 查询总数
        long total = productService.count(queryWrapper);
        
        // 分页查询商品数据
        List<Products> productsList = productService.list(queryWrapper.last("LIMIT " + pageSize + " OFFSET " + offset));
        
        // 转换为ProductPlatformVo列表
        List<ProductPlatformVo> productVoList = productsList.stream().map(this::convertToProductPlatformVo)
                .collect(Collectors.toList());
        
        // 封装分页结果
        PageResult<ProductPlatformVo> pageResult = new PageResult<>(page, pageSize, total, productVoList);
        
        return Result.success(pageResult);
    }
    
    /**
     * 获取平台所有商品列表（不分页）
     * @return 所有商品列表
     */
    @GetMapping("/listAll")
    public Result<List<ProductPlatformVo>> getAllProducts() {
        // 构造查询条件
        QueryWrapper<Products> queryWrapper = new QueryWrapper<>();
        // 只查询已审核通过的商品
        queryWrapper.eq("status", AuditEnum.APPROVED);
        // 只查询未删除的数据
        queryWrapper.eq("deleted", 0);
        // 按创建时间倒序排列
        queryWrapper.orderByDesc("create_time");
        
        // 查询所有商品数据
        List<Products> productsList = productService.list(queryWrapper);
        
        // 转换为ProductPlatformVo列表
        List<ProductPlatformVo> productVoList = productsList.stream().map(this::convertToProductPlatformVo)
                .collect(Collectors.toList());
        
        return Result.success(productVoList);
    }
    
    /**
     * 根据ID获取商品详情
     * @param id 商品ID
     * @return 商品详情
     */
    @GetMapping("/get")
    public Result<ProductPlatformVo> getProductById(@RequestParam Long id) {
        // 查询商品信息
        Products product = productService.getById(id);
        
        // 检查商品是否存在
        if (product == null) {
            return Result.error(500, "商品不存在");
        }

        // 检查商品是否已审核通过
        if (product.getStatus() != AuditEnum.APPROVED) {
            return Result.error(500, "商品未审核通过");
        }
        
        // 转换为ProductPlatformVo对象
        ProductPlatformVo productVo = convertToProductPlatformVo(product);
        
        return Result.success(productVo);
    }
    
    /**
     * 根据分类ID获取商品列表
     * @param categoryId 分类ID
     * @param page 页码
     * @param pageSize 每页数量
     * @return 分类下的商品列表
     */
    @GetMapping("/products/category/{categoryId}")
    public Result<PageResult<ProductPlatformVo>> getProductsByCategory(
            @PathVariable String categoryId,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer pageSize) {
        
        // 构造查询条件
        QueryWrapper<Products> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("category_id", categoryId);
        queryWrapper.eq("status", AuditEnum.APPROVED); // 只查询已审核通过的商品
        queryWrapper.eq("deleted", 0); // 只查询未删除的数据
        queryWrapper.orderByDesc("create_time"); // 按创建时间倒序排列
        
        // 查询总数
        long total = productService.count(queryWrapper);
        
        // 计算偏移量
        int offset = (page - 1) * pageSize;
        
        // 分页查询商品数据
        List<Products> productsList = productService.list(queryWrapper.last("limit " + offset + ", " + pageSize));
        
        // 转换为ProductPlatformVo列表
        List<ProductPlatformVo> productVoList = productsList.stream().map(this::convertToProductPlatformVo)
                .collect(Collectors.toList());
        
        // 封装分页结果
        PageResult<ProductPlatformVo> pageResult = new PageResult<>(page, pageSize, total, productVoList);
        
        return Result.success(pageResult);
    }
    
    /**
     * 将Products对象转换为ProductPlatformVo对象
     * @param products 商品对象
     * @return ProductPlatformVo对象
     */
    private ProductPlatformVo convertToProductPlatformVo(Products products) {
        ProductPlatformVo productVo = new ProductPlatformVo();
        BeanUtils.copyProperties(products, productVo);
        
        // 设置发布时间
        if (products.getCreateTime() != null) {
            productVo.setReleaseTime(products.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }
        
        // 查询关联的图片
        // 由于id是基本类型，不会为null，所以直接查询
        List<String> imageUrls = imagesService.list(new QueryWrapper<com.zby.admin.pojo.Images>()
                        .eq("product_id", products.getId())
                        .eq("deleted", 0))
                .stream()
                .map(com.zby.admin.pojo.Images::getUrl)
                .collect(Collectors.toList());
        productVo.setImage(imageUrls);
        
        // 查询发布者信息
        if (products.getUserId() != null && !products.getUserId().isEmpty()) {
            User user = userMapper.selectById(products.getUserId());
            if (user != null) {
                productVo.setUserNickname(user.getUserNickname());
            }
        }
        
        return productVo;
    }
}